Now we will join the tables of weather and flight in newark and start to look for correlation, with the delays.

flights_weather %>%
  mutate_at("date", as.Date) %>%
  group_by(date) %>%
  summarise(amount_departure = n()) %>%
  ggplot(aes(x = date, y = amount_departure)) +
  geom_line()

Between July and September the amount of departure is higher the graph present more peeks

flights_weather %>%
  mutate_at("date", as.Date) %>%
  group_by(date) %>%
  summarise(amount_departure = n()) %>%
  as_tsibble() %>%
  model(STL(amount_departure ~ trend(window = 12))) %>%
  components() %>%
  autoplot()
Using `date` as index variable.

The relation between dew point with ratio of delays and amount of delays looks quite same with the relation ofboth of them with temperature and the explanation could be the same, the reason behind the correlation is the increase in the number of schedule flights in summer season. We need to understand that dew_point and temperature are 2 variables that are high correlative.

Let’s check the correlation between wind direction, wind speed and wind gust

Here we can see that wind speed is correlative with wind direction and wind gust, but the more importants is that wind speed and wind gust are quite strong correlative so actually the correlation between wind gust and delays can be explain because the correlation between wind speed and delays. And the small relation between amount of delays and wind direction could be also have a explanatio in the correlation between wind speed and wind direction.

The relation between precipitation and amount of precipitation. Let’s check this relation

With this we can prove that it is a strong correlation between amount of precipitation and rain and snow the 2 categorical varibles that are more correlative with ration of delays. So we can explore more in the conection between precipitation and ration of delays.

correlation <- function(flights_weather, x, y){
  return(flights_weather %>%
  select(!!sym(x), !!sym(y)) %>%
  ggpairs(showStrips = TRUE))
}
correlation(flights_weather, "temp", "ration_delay")

correlation(flights_weather, "temp", "amount_delays")

correlation(flights_weather, "temp", "dep_delay")

The three variables that we use for measure delays are: - ration_delays: the proportion of flights that were delay over the total of flights that were schedule per hour. (0 - 1) - the amount of flights that were delay per hour - the duration of the delay The weather variables have been taking also by hour.

Here we see a very weak small correlation between temperature and ration of delays per hour (0.14), and the amount of delays and temperature (0.134). The correlation between temperature and duration of delays is extremely weak.

correlation(flights_weather, "dewp", "ration_delay")

correlation(flights_weather, "dewp", "amount_delays")

correlation(flights_weather, "dewp", "dep_delay")

And for logical consecuence the correlation between the 3 variables aren’t significally because actually temp and dew_point are highg correlative.

correlation(flights_weather, "wind_dir", "ration_delay")

correlation(flights_weather, "wind_dir", "amount_delays")

correlation(flights_weather, "wind_dir", "dep_delay")

it isn’t any correlation between the wind_direction and the 3 variables for measruring delays

correlation(flights_weather, "wind_speed", "ration_delay")

correlation(flights_weather, "wind_speed", "amount_delays")

correlation(flights_weather, "wind_speed", "dep_delay")

Here we can see a weak correlation between the amount_delays (0.321) per hour and the ration_delays (0.334) per_hour with wind_speed. It is also a very weak correlation between the duration of the delay (0.128) and wind_speed.

correlation(flights_weather, "wind_gust", "ration_delay")

correlation(flights_weather, "wind_gust", "amount_delays")

correlation(flights_weather, "wind_gust", "dep_delay")

The correlation between the 3 variables and wind_gust is very similar with the correlation that them have with wind_speed. This could be explain by the high correlation between wind_speed and wind_gust.

correlation(flights_weather, "precipitation", "ration_delay")

correlation(flights_weather, "precipitation", "amount_delays")

correlation(flights_weather, "precipitation", "dep_delay")

We can see that the 3 variables change a lot depending of the different types of precipitation.

correlation(flights_weather, "amount_precipitation", "ration_delay")

correlation(flights_weather, "amount_precipitation", "amount_delays")

correlation(flights_weather, "amount_precipitation", "dep_delay")

Even when it is a correlation between the different types of precipitation and amount of precipitation, the correlation between amount of delays, duration of delays and amount of precipitation doesn’t exist, and with the ration of delays is very weak (0.103)

correlation(flights_weather, "visibility", "ration_delay")

correlation(flights_weather, "visibility", "amount_delays")

correlation(flights_weather, "visibility", "dep_delay")

Here we can see a very week negative correlation between amount of delays per hour and visibility (-0.102), and ration_delays per hour and visibility (-0.134). The relation between duration of delays and visibilty doesn’t exist.

correlation(flights_weather, "pressure", "ration_delay")

correlation(flights_weather, "pressure", "amount_delays")

correlation(flights_weather, "pressure", "dep_delay")

Here we can see a weak negative correlation between ration of delays and the pressure (-0.205), and a very weak correlation between the amount of delays per hour (-0.18) and duration of delays (-0.109) with pressure.

The only 2 variables that have at less at weak correlation with ration of delays are wind_speed and pressure It is also a weak correlaion with wind_gust, but the problem with this feature is that is strong correlative with wind speed. It is also important study the correlation between the type of precipitation and ration of delays.

CORRELATION BETWWEN MONTHS AND WEATHER VARIABLES

correlation_month(flights_weather, 1, "dep_delay")

correlation_month(flights_weather, 2, "ration_delay")

correlation_month(flights_weather, 2, "dep_delay")

correlation_month(flights_weather, 4, "ration_delay")

correlation_month(flights_weather, 7, "ration_delay")

correlation_month(flights_weather, 7, "dep_delay")

correlation_month(flights_weather, 8, "ration_delay")

correlation_month(flights_weather, 9, "ration_delay")

correlation_month(flights_weather, 11, "dep_delay")

correlation_month(flights_weather, 12, "ration_delay")

correlation_month(flights_weather, 12, "dep_delay")

flights_weather %>%
  ggplot(aes(x = amount_precipitation)) +
  geom_histogram(bin = 100)
Ignoring unknown parameters: bin

Tempeture

flights_weather %>%
  filter(temp <= 0 | temp >=35)  %>%
  select(ration_delay, dep_delay, temp) %>%
  ggpairs()

flights_weather %>%
  filter(wind_speed >= 25)  %>%
  select(ration_delay, dep_delay, wind_speed) %>%
  ggpairs()

flights_weather %>%
  filter(amount_precipitation > 0.5)  %>%
  select(ration_delay, dep_delay, amount_precipitation) %>%
  ggpairs()

flights_weather %>%
  filter(temp <=0 & precipitation == "Rain")  %>%
  select(ration_delay, dep_delay, precipitation, temp) %>%
  ggpairs()

model_temp <- lm(ration_delay ~ temp + wind_speed, data = flights_weather)
summary(model_temp)

Call:
lm(formula = ration_delay ~ temp + wind_speed, data = flights_weather)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.48591 -0.14760 -0.05417  0.11520  0.92151 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 8.962e-02  1.669e-03   53.69   <2e-16 ***
temp        3.710e-03  6.485e-05   57.20   <2e-16 ***
wind_speed  1.581e-02  1.341e-04  117.92   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2059 on 99767 degrees of freedom
Multiple R-squared:  0.1396,    Adjusted R-squared:  0.1396 
F-statistic:  8095 on 2 and 99767 DF,  p-value: < 2.2e-16
flights_weather_1 <- flights %>%
  inner_join(weather, by = "date") %>%
  select(-c(origin.y, origin.x))

flights_weather_2 <- flights_weather_1 %>%
  filter(hour(date) >= 6) %>%
  group_by(hour(date)) %>%
  summarise(count_t = n())

flights_weather_1 %>%
  filter(dep_delay == 2500) %>%
  filter(hour(date) >= 6) %>%
  group_by(hour(date)) %>%
  summarise(count = n()) %>%
  inner_join(flights_weather_2, by = "hour(date)") %>%
  mutate(avr = count/ count_t)
NA
f_w <- flights_weather_1 %>%
  filter(dep_delay == 2500) %>%
  filter(amount_precipitation > 0.2 |
           wind_speed >= 20 |
           temp <= 0 | temp > 35 | precipitation == "Snow" | precipitation == "Ice Pellets")

f_w_2 <- flights_weather_1 %>%
  filter(amount_precipitation > 0.2 |
           wind_speed >= 20 |
           temp <= 0 | temp > 35 | precipitation == "Snow" | precipitation == "Ice Pellets") %>%
  group_by(hour(date)) %>%
  summarise(count_t = n())


f_w %>%
  filter(hour(date) >= 6) %>%
  group_by(hour(date)) %>%
  summarise(count = n()) %>%
  inner_join(f_w_2, by = "hour(date)") %>%
  mutate(avr = count/ count_t)

f_w <- flights_weather_1 %>%
  filter(dep_delay == 2500 ) %>%
  filter(!(amount_precipitation > 0.2 |
           wind_speed >= 20 |
           temp <= 0 | temp > 35 | precipitation == "Snow" | precipitation == "Ice Pellets"))

f_w_2 <- flights_weather_1 %>%
   filter(!(amount_precipitation > 0.2 |
           wind_speed >= 20 |
           temp <= 0 | temp > 35 | precipitation == "Snow" | precipitation == "Ice Pellets")) %>%
  group_by(hour(date)) %>%
  summarise(count_t = n())

f_w %>%
  filter(hour(date) >= 6) %>%
  group_by(hour(date)) %>%
  summarise(count = n()) %>%
  inner_join(f_w_2, by = "hour(date)") %>%
  mutate(avr = count/ count_t)
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKTm93IHdlIHdpbGwgam9pbiB0aGUgdGFibGVzIG9mIHdlYXRoZXIgYW5kIGZsaWdodCBpbiBuZXdhcmsgYW5kIHN0YXJ0IHRvIGxvb2sgZm9yIGNvcnJlbGF0aW9uLCB3aXRoIHRoZSBkZWxheXMuIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KG1vZGVscikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkodHNpYmJsZSkKbGlicmFyeShmZWFzdHMpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmZsaWdodHMgPC0gcmVhZF9jc3YoaGVyZSgiY2xlYW5fZGF0YS9mbGlnaHRzLmNzdiIpKQp3ZWF0aGVyIDwtIHJlYWRfY3N2KGhlcmUoImNsZWFuX2RhdGEvd2VhdGhlci5jc3YiKSkKCmZsaWdodHMgPC0gZmxpZ2h0cyAlPiUKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKQoKZmxpZ2h0c193ZWF0aGVyIDwtIGZsaWdodHMgJT4lCiAgaW5uZXJfam9pbih3ZWF0aGVyLCBieSA9ICJkYXRlIikgJT4lCiAgc2VsZWN0KC1jKG9yaWdpbi55LCBvcmlnaW4ueCkpICU+JQogIGZpbHRlcihkZXBfZGVsYXkgIT0gMjUwMCkKCmZsaWdodHNfd2VhdGhlciA8LSBmbGlnaHRzX3dlYXRoZXIgJT4lCiAgbXV0YXRlKHRvdGFsX2RlbGF5ID0gaWZlbHNlKGJldHdlZW4oZGVwX2RlbGF5LCAxNSwgMjQwMCksIDEsIDApKSAlPiUKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UocmF0aW9uX2RlbGF5ID0gc3VtKHRvdGFsX2RlbGF5KS9uKCkpICU+JQogIGlubmVyX2pvaW4oZmxpZ2h0c193ZWF0aGVyLCBieSA9ICJkYXRlIikKCmZsaWdodHNfd2VhdGhlciA8LSBmbGlnaHRzX3dlYXRoZXIgJT4lCiAgZmlsdGVyKGJldHdlZW4oZGVwX2RlbGF5LCAxNSwgMjQwMCkpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShhbW91bnRfZGVsYXlzID0gbigpKSAlPiUKICBpbm5lcl9qb2luKGZsaWdodHNfd2VhdGhlciwgYnkgPSAiZGF0ZSIpCmBgYAoKCmBgYHtyfQpmbGlnaHRzX3dlYXRoZXIgJT4lCiAgbXV0YXRlX2F0KCJkYXRlIiwgYXMuRGF0ZSkgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKGFtb3VudF9kZXBhcnR1cmUgPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBhbW91bnRfZGVwYXJ0dXJlKSkgKwogIGdlb21fbGluZSgpCmBgYAoKQmV0d2VlbiBKdWx5IGFuZCBTZXB0ZW1iZXIgdGhlIGFtb3VudCBvZiBkZXBhcnR1cmUgaXMgaGlnaGVyIHRoZSBncmFwaCBwcmVzZW50IG1vcmUgcGVla3MKYGBge3J9CmZsaWdodHNfd2VhdGhlciAlPiUKICBtdXRhdGVfYXQoImRhdGUiLCBhcy5EYXRlKSAlPiUKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UoYW1vdW50X2RlcGFydHVyZSA9IG4oKSkgJT4lCiAgYXNfdHNpYmJsZSgpICU+JQogIG1vZGVsKFNUTChhbW91bnRfZGVwYXJ0dXJlIH4gdHJlbmQod2luZG93ID0gMTIpKSkgJT4lCiAgY29tcG9uZW50cygpICU+JQogIGF1dG9wbG90KCkKYGBgCgoKVGhlIHJlbGF0aW9uIGJldHdlZW4gZGV3IHBvaW50IHdpdGggcmF0aW8gb2YgZGVsYXlzIGFuZCBhbW91bnQgb2YgZGVsYXlzIGxvb2tzIHF1aXRlIHNhbWUgd2l0aCB0aGUgcmVsYXRpb24gb2Zib3RoIG9mIHRoZW0gd2l0aCB0ZW1wZXJhdHVyZSBhbmQgdGhlIGV4cGxhbmF0aW9uIGNvdWxkIGJlIHRoZSBzYW1lLCB0aGUgcmVhc29uIGJlaGluZCB0aGUgY29ycmVsYXRpb24gaXMgdGhlIGluY3JlYXNlIGluIHRoZSBudW1iZXIgb2Ygc2NoZWR1bGUgZmxpZ2h0cyBpbiBzdW1tZXIgc2Vhc29uLiBXZSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBkZXdfcG9pbnQgYW5kIHRlbXBlcmF0dXJlIGFyZSAyIHZhcmlhYmxlcyB0aGF0IGFyZSBoaWdoIGNvcnJlbGF0aXZlLgpgYGB7cn0KZmxpZ2h0c193ZWF0aGVyICU+JQogIHNlbGVjdCh0ZW1wLCBkZXdwKSAlPiUKICBnZ3BhaXJzKCkKYGBgCgoKCgpMZXQncyBjaGVjayB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB3aW5kIGRpcmVjdGlvbiwgd2luZCBzcGVlZCBhbmQgd2luZCBndXN0CmBgYHtyfQpmbGlnaHRzX3dlYXRoZXIgJT4lCiAgc2VsZWN0KHdpbmRfZGlyLCB3aW5kX3NwZWVkLCB3aW5kX2d1c3QpICU+JQogIGdncGFpcnMoKQpgYGAKCkhlcmUgd2UgY2FuIHNlZSB0aGF0IHdpbmQgc3BlZWQgaXMgY29ycmVsYXRpdmUgd2l0aCB3aW5kIGRpcmVjdGlvbiBhbmQgd2luZCBndXN0LCBidXQgdGhlIG1vcmUgaW1wb3J0YW50cyBpcyB0aGF0IHdpbmQgc3BlZWQgYW5kIHdpbmQgZ3VzdCBhcmUgcXVpdGUgc3Ryb25nIGNvcnJlbGF0aXZlIHNvIGFjdHVhbGx5IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHdpbmQgZ3VzdCBhbmQgZGVsYXlzIGNhbiBiZSBleHBsYWluIGJlY2F1c2UgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gd2luZCBzcGVlZCBhbmQgZGVsYXlzLiBBbmQgdGhlIHNtYWxsIHJlbGF0aW9uIGJldHdlZW4gYW1vdW50IG9mIGRlbGF5cyBhbmQgd2luZCBkaXJlY3Rpb24gY291bGQgYmUgYWxzbyBoYXZlIGEgZXhwbGFuYXRpbyBpbiB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB3aW5kIHNwZWVkIGFuZCB3aW5kIGRpcmVjdGlvbi4KClRoZSByZWxhdGlvbiBiZXR3ZWVuIHByZWNpcGl0YXRpb24gYW5kIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uLiBMZXQncyBjaGVjayB0aGlzIHJlbGF0aW9uCgpgYGB7cn0KZmxpZ2h0c193ZWF0aGVyICU+JQogIHNlbGVjdChwcmVjaXBpdGF0aW9uLCBhbW91bnRfcHJlY2lwaXRhdGlvbikgJT4lCiAgZ2dwYWlycyhzaG93U3RyaXBzID0gVFJVRSkKYGBgCldpdGggdGhpcyB3ZSBjYW4gcHJvdmUgdGhhdCBpdCBpcyBhIHN0cm9uZyBjb3JyZWxhdGlvbiBiZXR3ZWVuIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGFuZCByYWluIGFuZCBzbm93IHRoZSAyIGNhdGVnb3JpY2FsIHZhcmlibGVzIHRoYXQgYXJlIG1vcmUgY29ycmVsYXRpdmUgd2l0aCByYXRpb24gb2YgZGVsYXlzLiBTbyB3ZSBjYW4gZXhwbG9yZSBtb3JlIGluIHRoZSBjb25lY3Rpb24gYmV0d2VlbiBwcmVjaXBpdGF0aW9uIGFuZCByYXRpb24gb2YgZGVsYXlzLgoKCgoKYGBge3J9CmNvcnJlbGF0aW9uIDwtIGZ1bmN0aW9uKGZsaWdodHNfd2VhdGhlciwgeCwgeSl7CiAgcmV0dXJuKGZsaWdodHNfd2VhdGhlciAlPiUKICBzZWxlY3QoISFzeW0oeCksICEhc3ltKHkpKSAlPiUKICBnZ3BhaXJzKHNob3dTdHJpcHMgPSBUUlVFKSkKfQpgYGAKCmBgYHtyfQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJ0ZW1wIiwgInJhdGlvbl9kZWxheSIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgInRlbXAiLCAiYW1vdW50X2RlbGF5cyIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgInRlbXAiLCAiZGVwX2RlbGF5IikKYGBgClRoZSB0aHJlZSB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgZm9yIG1lYXN1cmUgZGVsYXlzIGFyZToKLSByYXRpb25fZGVsYXlzOiB0aGUgcHJvcG9ydGlvbiBvZiBmbGlnaHRzIHRoYXQgd2VyZSBkZWxheSBvdmVyIHRoZSB0b3RhbCBvZiBmbGlnaHRzIHRoYXQgd2VyZSBzY2hlZHVsZSBwZXIgaG91ci4gKDAgLSAxKQotIHRoZSBhbW91bnQgb2YgZmxpZ2h0cyB0aGF0IHdlcmUgZGVsYXkgcGVyIGhvdXIKLSB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5ClRoZSB3ZWF0aGVyIHZhcmlhYmxlcyBoYXZlIGJlZW4gdGFraW5nIGFsc28gYnkgaG91ci4KCkhlcmUgd2Ugc2VlIGEgdmVyeSB3ZWFrIHNtYWxsIGNvcnJlbGF0aW9uIGJldHdlZW4gdGVtcGVyYXR1cmUgYW5kIHJhdGlvbiBvZiBkZWxheXMgcGVyIGhvdXIgKDAuMTQpLCBhbmQgdGhlIGFtb3VudCBvZiBkZWxheXMgYW5kIHRlbXBlcmF0dXJlICgwLjEzNCkuIFRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRlbXBlcmF0dXJlIGFuZCBkdXJhdGlvbiBvZiBkZWxheXMgaXMgZXh0cmVtZWx5IHdlYWsuCmBgYHtyfQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJkZXdwIiwgInJhdGlvbl9kZWxheSIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgImRld3AiLCAiYW1vdW50X2RlbGF5cyIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgImRld3AiLCAiZGVwX2RlbGF5IikKYGBgCgpBbmQgZm9yIGxvZ2ljYWwgY29uc2VjdWVuY2UgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIDMgdmFyaWFibGVzIGFyZW4ndCBzaWduaWZpY2FsbHkgYmVjYXVzZSBhY3R1YWxseSB0ZW1wIGFuZCBkZXdfcG9pbnQgYXJlIGhpZ2hnIGNvcnJlbGF0aXZlLgpgYGB7cn0KY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAid2luZF9kaXIiLCAicmF0aW9uX2RlbGF5IikKY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAid2luZF9kaXIiLCAiYW1vdW50X2RlbGF5cyIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgIndpbmRfZGlyIiwgImRlcF9kZWxheSIpCmBgYAoKaXQgaXNuJ3QgYW55IGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHdpbmRfZGlyZWN0aW9uIGFuZCB0aGUgMyB2YXJpYWJsZXMgZm9yIG1lYXNydXJpbmcgZGVsYXlzCmBgYHtyfQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJ3aW5kX3NwZWVkIiwgInJhdGlvbl9kZWxheSIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgIndpbmRfc3BlZWQiLCAiYW1vdW50X2RlbGF5cyIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgIndpbmRfc3BlZWQiLCAiZGVwX2RlbGF5IikKYGBgCgpIZXJlIHdlIGNhbiBzZWUgYSB3ZWFrIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGFtb3VudF9kZWxheXMgKDAuMzIxKSBwZXIgaG91ciBhbmQgdGhlIHJhdGlvbl9kZWxheXMgKDAuMzM0KSBwZXJfaG91ciB3aXRoIHdpbmRfc3BlZWQuIEl0IGlzIGFsc28gYSB2ZXJ5IHdlYWsgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5ICgwLjEyOCkgYW5kIHdpbmRfc3BlZWQuCgpgYGB7cn0KY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAid2luZF9ndXN0IiwgInJhdGlvbl9kZWxheSIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgIndpbmRfZ3VzdCIsICJhbW91bnRfZGVsYXlzIikKY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAid2luZF9ndXN0IiwgImRlcF9kZWxheSIpCmBgYAoKVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIDMgdmFyaWFibGVzIGFuZCB3aW5kX2d1c3QgaXMgdmVyeSBzaW1pbGFyIHdpdGggdGhlIGNvcnJlbGF0aW9uIHRoYXQgdGhlbSBoYXZlIHdpdGggd2luZF9zcGVlZC4gVGhpcyBjb3VsZCBiZSBleHBsYWluIGJ5IHRoZSBoaWdoIGNvcnJlbGF0aW9uIGJldHdlZW4gd2luZF9zcGVlZCBhbmQgd2luZF9ndXN0LgpgYGB7cn0KY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAicHJlY2lwaXRhdGlvbiIsICJyYXRpb25fZGVsYXkiKQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJwcmVjaXBpdGF0aW9uIiwgImFtb3VudF9kZWxheXMiKQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJwcmVjaXBpdGF0aW9uIiwgImRlcF9kZWxheSIpCmBgYAoKV2UgY2FuIHNlZSB0aGF0IHRoZSAzIHZhcmlhYmxlcyBjaGFuZ2UgYSBsb3QgZGVwZW5kaW5nIG9mIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlY2lwaXRhdGlvbi4gCmBgYHtyfQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJhbW91bnRfcHJlY2lwaXRhdGlvbiIsICJyYXRpb25fZGVsYXkiKQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJhbW91bnRfcHJlY2lwaXRhdGlvbiIsICJhbW91bnRfZGVsYXlzIikKY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAiYW1vdW50X3ByZWNpcGl0YXRpb24iLCAiZGVwX2RlbGF5IikKYGBgCgpFdmVuIHdoZW4gaXQgaXMgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlY2lwaXRhdGlvbiBhbmQgYW1vdW50IG9mIHByZWNpcGl0YXRpb24sIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGFtb3VudCBvZiBkZWxheXMsIGR1cmF0aW9uIG9mIGRlbGF5cyBhbmQgYW1vdW50IG9mIHByZWNpcGl0YXRpb24gZG9lc24ndCBleGlzdCwgYW5kIHdpdGggdGhlIHJhdGlvbiBvZiBkZWxheXMgaXMgdmVyeSB3ZWFrICgwLjEwMykKYGBge3J9CmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgInZpc2liaWxpdHkiLCAicmF0aW9uX2RlbGF5IikKY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAidmlzaWJpbGl0eSIsICJhbW91bnRfZGVsYXlzIikKY29ycmVsYXRpb24oZmxpZ2h0c193ZWF0aGVyLCAidmlzaWJpbGl0eSIsICJkZXBfZGVsYXkiKQpgYGAKCkhlcmUgd2UgY2FuIHNlZSBhIHZlcnkgd2VlayBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGFtb3VudCBvZiBkZWxheXMgcGVyIGhvdXIgYW5kIHZpc2liaWxpdHkgKC0wLjEwMiksIGFuZCByYXRpb25fZGVsYXlzIHBlciBob3VyIGFuZCB2aXNpYmlsaXR5ICgtMC4xMzQpLiBUaGUgcmVsYXRpb24gYmV0d2VlbiBkdXJhdGlvbiBvZiBkZWxheXMgYW5kIHZpc2liaWx0eSBkb2Vzbid0IGV4aXN0LgoKYGBge3J9CmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgInByZXNzdXJlIiwgInJhdGlvbl9kZWxheSIpCmNvcnJlbGF0aW9uKGZsaWdodHNfd2VhdGhlciwgInByZXNzdXJlIiwgImFtb3VudF9kZWxheXMiKQpjb3JyZWxhdGlvbihmbGlnaHRzX3dlYXRoZXIsICJwcmVzc3VyZSIsICJkZXBfZGVsYXkiKQpgYGAKCkhlcmUgd2UgY2FuIHNlZSBhIHdlYWsgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiByYXRpb24gb2YgZGVsYXlzIGFuZCB0aGUgcHJlc3N1cmUgKC0wLjIwNSksIGFuZCBhIHZlcnkgd2VhayBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBhbW91bnQgb2YgZGVsYXlzIHBlciBob3VyICgtMC4xOCkgYW5kIGR1cmF0aW9uIG9mIGRlbGF5cyAoLTAuMTA5KSB3aXRoIHByZXNzdXJlLiAKClRoZSBvbmx5IDIgdmFyaWFibGVzIHRoYXQgaGF2ZSBhdCBsZXNzIGF0IHdlYWsgY29ycmVsYXRpb24gd2l0aCByYXRpb24gb2YgZGVsYXlzIGFyZSB3aW5kX3NwZWVkIGFuZCBwcmVzc3VyZSBJdCBpcyBhbHNvIGEgd2VhayBjb3JyZWxhaW9uIHdpdGggd2luZF9ndXN0LCBidXQgdGhlIHByb2JsZW0gd2l0aCB0aGlzIGZlYXR1cmUgaXMgdGhhdCBpcyBzdHJvbmcgY29ycmVsYXRpdmUgd2l0aCB3aW5kIHNwZWVkLiBJdCBpcyBhbHNvIGltcG9ydGFudCBzdHVkeSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdHlwZSBvZiBwcmVjaXBpdGF0aW9uIGFuZCByYXRpb24gb2YgZGVsYXlzLiAKCkNPUlJFTEFUSU9OIEJFVFdXRU4gTU9OVEhTIEFORCBXRUFUSEVSIFZBUklBQkxFUwoKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoIDwtIGZ1bmN0aW9uKGZsaWdodHNfd2VhdGhlciwgbW9udGgsIHZhcmlhYmxlKSB7IApyZXR1cm4oZmxpZ2h0c193ZWF0aGVyICU+JQogIGZpbHRlcihtb250aChkYXRlKSA9PSBtb250aCkgJT4lCiAgc2VsZWN0KCEhc3ltKHZhcmlhYmxlKSwgdGVtcCwgZGV3cCwgd2luZF9kaXIsIHdpbmRfc3BlZWQsIHdpbmRfZ3VzdCwgdmlzaWJpbGl0eSwgCiAgICAgICAgIHByZXNzdXJlLCBwcmVjaXBpdGF0aW9uLCBhbW91bnRfcHJlY2lwaXRhdGlvbikgJT4lCiAgZ2dwYWlycyh0aXRsZSA9IGFzLmNoYXJhY3Rlcihtb250aCksIHNob3dTdHJpcHMgPSBUUlVFKSkKfSAKY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxLCAicmF0aW9uX2RlbGF5IikKYGBgCgpgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxLCAiZGVwX2RlbGF5IikKYGBgCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDIsICJyYXRpb25fZGVsYXkiKQpgYGAKCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDIsICJkZXBfZGVsYXkiKQpgYGAKCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDMsICJyYXRpb25fZGVsYXkiKQpgYGAKCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDMsICJkZXBfZGVsYXkiKQpgYGAKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgNCwgInJhdGlvbl9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCA0LCAiZGVwX2RlbGF5IikKYGBgCgpgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCA1LCAicmF0aW9uX2RlbGF5IikKYGBgCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDUsICJkZXBfZGVsYXkiKQpgYGAKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgNiwgInJhdGlvbl9kZWxheSIpCmBgYAoKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgNiwgImRlcF9kZWxheSIpCmBgYAoKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgNywgInJhdGlvbl9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCA3LCAiZGVwX2RlbGF5IikKYGBgCgpgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCA4LCAicmF0aW9uX2RlbGF5IikKYGBgCgpgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCA4LCAiZGVwX2RlbGF5IikKYGBgCmBgYHtyfQpjb3JyZWxhdGlvbl9tb250aChmbGlnaHRzX3dlYXRoZXIsIDksICJyYXRpb25fZGVsYXkiKQpgYGAKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgOSwgImRlcF9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxMCwgInJhdGlvbl9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxMCwgImRlcF9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxMSwgInJhdGlvbl9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxMSwgImRlcF9kZWxheSIpCmBgYApgYGB7cn0KY29ycmVsYXRpb25fbW9udGgoZmxpZ2h0c193ZWF0aGVyLCAxMiwgInJhdGlvbl9kZWxheSIpCmBgYAoKYGBge3J9CmNvcnJlbGF0aW9uX21vbnRoKGZsaWdodHNfd2VhdGhlciwgMTIsICJkZXBfZGVsYXkiKQpgYGAKCmBgYHtyfQpmbGlnaHRzX3dlYXRoZXIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYW1vdW50X3ByZWNpcGl0YXRpb24pKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmluID0gMTAwKQpgYGAKVGVtcGV0dXJlCmBgYHtyfQpmbGlnaHRzX3dlYXRoZXIgJT4lCiAgZmlsdGVyKHRlbXAgPD0gMCB8IHRlbXAgPj0zNSkgICU+JQogIHNlbGVjdChyYXRpb25fZGVsYXksIGRlcF9kZWxheSwgdGVtcCkgJT4lCiAgZ2dwYWlycygpCmBgYAoKYGBge3J9CmZsaWdodHNfd2VhdGhlciAlPiUKICBmaWx0ZXIod2luZF9zcGVlZCA+PSAyNSkgICU+JQogIHNlbGVjdChyYXRpb25fZGVsYXksIGRlcF9kZWxheSwgd2luZF9zcGVlZCkgJT4lCiAgZ2dwYWlycygpCmBgYAoKYGBge3J9CmZsaWdodHNfd2VhdGhlciAlPiUKICBmaWx0ZXIoYW1vdW50X3ByZWNpcGl0YXRpb24gPiAwLjUpICAlPiUKICBzZWxlY3QocmF0aW9uX2RlbGF5LCBkZXBfZGVsYXksIGFtb3VudF9wcmVjaXBpdGF0aW9uKSAlPiUKICBnZ3BhaXJzKCkKYGBgCgpgYGB7cn0KZmxpZ2h0c193ZWF0aGVyICU+JQogIGZpbHRlcih0ZW1wIDw9MCAmIHByZWNpcGl0YXRpb24gPT0gIlJhaW4iKSAgJT4lCiAgc2VsZWN0KHJhdGlvbl9kZWxheSwgZGVwX2RlbGF5LCBwcmVjaXBpdGF0aW9uLCB0ZW1wKSAlPiUKICBnZ3BhaXJzKCkKYGBgCgpgYGB7cn0KbW9kZWxfdGVtcCA8LSBsbShyYXRpb25fZGVsYXkgfiB0ZW1wICsgd2luZF9zcGVlZCwgZGF0YSA9IGZsaWdodHNfd2VhdGhlcikKc3VtbWFyeShtb2RlbF90ZW1wKQpgYGAKCgoKCmBgYHtyfQpmbGlnaHRzX3dlYXRoZXJfMSA8LSBmbGlnaHRzICU+JQogIGlubmVyX2pvaW4od2VhdGhlciwgYnkgPSAiZGF0ZSIpICU+JQogIHNlbGVjdCgtYyhvcmlnaW4ueSwgb3JpZ2luLngpKQoKZmxpZ2h0c193ZWF0aGVyXzIgPC0gZmxpZ2h0c193ZWF0aGVyXzEgJT4lCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPj0gNikgJT4lCiAgZ3JvdXBfYnkoaG91cihkYXRlKSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50X3QgPSBuKCkpCgpmbGlnaHRzX3dlYXRoZXJfMSAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID09IDI1MDApICU+JQogIGZpbHRlcihob3VyKGRhdGUpID49IDYpICU+JQogIGdyb3VwX2J5KGhvdXIoZGF0ZSkpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiAgaW5uZXJfam9pbihmbGlnaHRzX3dlYXRoZXJfMiwgYnkgPSAiaG91cihkYXRlKSIpICU+JQogIG11dGF0ZShhdnIgPSBjb3VudC8gY291bnRfdCkKICAKYGBgCgoKCmBgYHtyfQpmX3cgPC0gZmxpZ2h0c193ZWF0aGVyXzEgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA9PSAyNTAwKSAlPiUKICBmaWx0ZXIoYW1vdW50X3ByZWNpcGl0YXRpb24gPiAwLjIgfAogICAgICAgICAgIHdpbmRfc3BlZWQgPj0gMjAgfAogICAgICAgICAgIHRlbXAgPD0gMCB8IHRlbXAgPiAzNSB8IHByZWNpcGl0YXRpb24gPT0gIlNub3ciIHwgcHJlY2lwaXRhdGlvbiA9PSAiSWNlIFBlbGxldHMiKQoKZl93XzIgPC0gZmxpZ2h0c193ZWF0aGVyXzEgJT4lCiAgZmlsdGVyKGFtb3VudF9wcmVjaXBpdGF0aW9uID4gMC4yIHwKICAgICAgICAgICB3aW5kX3NwZWVkID49IDIwIHwKICAgICAgICAgICB0ZW1wIDw9IDAgfCB0ZW1wID4gMzUgfCBwcmVjaXBpdGF0aW9uID09ICJTbm93IiB8IHByZWNpcGl0YXRpb24gPT0gIkljZSBQZWxsZXRzIikgJT4lCiAgZ3JvdXBfYnkoaG91cihkYXRlKSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50X3QgPSBuKCkpCgoKZl93ICU+JQogIGZpbHRlcihob3VyKGRhdGUpID49IDYpICU+JQogIGdyb3VwX2J5KGhvdXIoZGF0ZSkpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiAgaW5uZXJfam9pbihmX3dfMiwgYnkgPSAiaG91cihkYXRlKSIpICU+JQogIG11dGF0ZShhdnIgPSBjb3VudC8gY291bnRfdCkKYGBgCmBgYHtyfQoKZl93IDwtIGZsaWdodHNfd2VhdGhlcl8xICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPT0gMjUwMCApICU+JQogIGZpbHRlcighKGFtb3VudF9wcmVjaXBpdGF0aW9uID4gMC4yIHwKICAgICAgICAgICB3aW5kX3NwZWVkID49IDIwIHwKICAgICAgICAgICB0ZW1wIDw9IDAgfCB0ZW1wID4gMzUgfCBwcmVjaXBpdGF0aW9uID09ICJTbm93IiB8IHByZWNpcGl0YXRpb24gPT0gIkljZSBQZWxsZXRzIikpCgpmX3dfMiA8LSBmbGlnaHRzX3dlYXRoZXJfMSAlPiUKICAgZmlsdGVyKCEoYW1vdW50X3ByZWNpcGl0YXRpb24gPiAwLjIgfAogICAgICAgICAgIHdpbmRfc3BlZWQgPj0gMjAgfAogICAgICAgICAgIHRlbXAgPD0gMCB8IHRlbXAgPiAzNSB8IHByZWNpcGl0YXRpb24gPT0gIlNub3ciIHwgcHJlY2lwaXRhdGlvbiA9PSAiSWNlIFBlbGxldHMiKSkgJT4lCiAgZ3JvdXBfYnkoaG91cihkYXRlKSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50X3QgPSBuKCkpCgpmX3cgJT4lCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPj0gNikgJT4lCiAgZ3JvdXBfYnkoaG91cihkYXRlKSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICBpbm5lcl9qb2luKGZfd18yLCBieSA9ICJob3VyKGRhdGUpIikgJT4lCiAgbXV0YXRlKGF2ciA9IGNvdW50LyBjb3VudF90KQoKYGBg